#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
广电用户数据处理脚本
用于处理mediamatch_usermsg_first20000.csv数据集，执行标签分配并生成宽表格式输出
"""
import os
import sys
import pandas as pd
import numpy as np
from datetime import datetime

# 添加src目录到Python路径
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))

from src.data_processor import comprehensive_data_preprocessing
from src.user_label_generator import generate_user_labels, convert_to_wide_format
from src.data_validator import validate_data_quality

def process_media_user_data(input_file, output_file, rule_based_ratio=0.3):
    """
    处理广电用户数据并生成宽表格式输出
    
    参数:
    input_file: 输入文件路径
    output_file: 输出文件路径
    rule_based_ratio: 基于规则打标的比例
    """
    print("=" * 60)
    print(f"开始处理广电用户数据: {input_file}")
    print(f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print("=" * 60)
    
    try:
        # 1. 读取原始数据，指定分隔符为;
        print("\n[步骤1] 读取原始数据...")
        if not os.path.exists(input_file):
            raise FileNotFoundError(f"输入文件不存在: {input_file}")
        
        df = pd.read_csv(input_file, sep=';', encoding='utf-8')
        print(f"  成功读取 {len(df)} 条记录")
        print(f"  原始列名: {df.columns.tolist()}")
        
        # 2. 列名标准化 - 针对distinct_usermsg.xxx格式
        print("\n[步骤2] 列名标准化...")
        column_mapping = {}
        
        # 映射所有distinct_usermsg.xxx列名到简化版本
        for col in df.columns:
            if col.startswith('distinct_usermsg.'):
                # 提取简化列名
                simplified_col = col.replace('distinct_usermsg.', '')
                column_mapping[col] = simplified_col
                print(f"  映射: {col} -> {simplified_col}")
        
        # 重命名列
        if column_mapping:
            df = df.rename(columns=column_mapping)
            print(f"  已标准化 {len(column_mapping)} 个列名")
        
        # 3. 数据预处理
        print("\n[步骤3] 数据预处理...")
        
        # 处理NULL值
        df = df.replace('NULL', np.nan)
        
        # 确保关键列存在
        required_columns = ['phone_no', 'run_time', 'sm_name']
        missing_columns = [col for col in required_columns if col not in df.columns]
        if missing_columns:
            print(f"  警告: 缺少必要的列 {missing_columns}")
            # 尝试自动查找可能的列名
            for missing_col in missing_columns:
                for col in df.columns:
                    if missing_col in col:
                        print(f"  自动映射: {col} -> {missing_col}")
                        df = df.rename(columns={col: missing_col})
                        break
        
        # 检查phone_no列是否存在，作为用户ID列
        if 'phone_no' not in df.columns:
            # 尝试使用terminal_no作为备选
            if 'terminal_no' in df.columns:
                print("  使用terminal_no作为用户ID列")
                df = df.rename(columns={'terminal_no': 'phone_no'})
            else:
                raise KeyError("找不到用户ID列，请检查数据格式")
        
        # 4. 数据质量验证
        print("\n[步骤4] 数据质量验证...")
        try:
            validation_result = validate_data_quality(df)
            print(f"  验证结果: {'通过' if validation_result['is_valid'] else '未通过'}")
        except Exception as e:
            print(f"  验证过程中出错: {e}")
            print("  继续处理...")
        
        # 5. 生成用户标签
        print("\n[步骤5] 生成用户标签...")
        labeled_df = generate_user_labels(df, rule_based_ratio)
        
        # 6. 转换为宽表格式
        print("\n[步骤6] 转换为宽表格式...")
        wide_df = convert_to_wide_format(labeled_df, id_column='phone_no', label_column='user_label')
        
        # 7. 保存结果
        print("\n[步骤7] 保存结果...")
        wide_df.to_csv(output_file, sep=';', index=False, encoding='utf-8')
        print(f"  结果已保存到: {output_file}")
        print(f"  宽表数据行数: {len(wide_df)}")
        print(f"  宽表数据列数: {wide_df.shape[1]}")
        print(f"  宽表列名: {wide_df.columns.tolist()}")
        
        print("\n=" * 60)
        print(f"处理完成! 时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        print("=" * 60)
        
        return wide_df
        
    except Exception as e:
        print(f"处理过程中出错: {str(e)}")
        import traceback
        traceback.print_exc()
        raise

def main():
    """
    主函数
    """
    # 定义文件路径
    input_file = r"c:\Users\Administrator\RuoYi-Vue01\python_project\mediamatch_usermsg_first20000.csv"
    output_file = r"c:\Users\Administrator\RuoYi-Vue01\python_project\media_users_wide_table.csv"
    
    # 设置基于规则打标的比例
    rule_based_ratio = 0.3  # 30%的用户使用规则打标，70%随机打标
    
    # 执行处理
    process_media_user_data(input_file, output_file, rule_based_ratio)

if __name__ == "__main__":
    main()